package com.cencat.order.service;

import com.cencat.order.domain.Route;
import com.cencat.order.domain.RoutePoint;
import com.cencat.order.domain.RouteTimeWindow;
import com.cencat.order.domain.vo.RouteVO;
import com.cencat.order.domain.vo.RouteStatisticsVO;
import com.cencat.order.domain.vo.RouteAnalysisVO;
import com.cencat.order.domain.vo.RouteOptimizationVO;
import com.cencat.order.domain.dto.RouteCreateDTO;
import com.cencat.order.domain.dto.RouteUpdateDTO;
import com.cencat.order.domain.dto.RouteOptimizeDTO;
import com.cencat.order.domain.dto.RouteTemplateDTO;
import com.baomidou.mybatisplus.extension.service.IService;

import java.util.List;
import java.util.Map;

/**
 * 路线管理服务接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface IRouteService extends IService<Route> {

    /**
     * 查询路线列表
     * 
     * @param route 路线查询条件
     * @return 路线列表
     */
    List<Route> selectRouteList(Route route);

    /**
     * 获取路线详情
     * 
     * @param routeId 路线ID
     * @return 路线详情VO
     */
    RouteVO getRouteDetail(Long routeId);

    /**
     * 创建路线
     * 
     * @param createDTO 创建路线DTO
     * @return 路线详情VO
     */
    RouteVO createRoute(RouteCreateDTO createDTO);

    /**
     * 更新路线
     * 
     * @param updateDTO 更新路线DTO
     * @return 是否成功
     */
    boolean updateRoute(RouteUpdateDTO updateDTO);

    /**
     * 删除路线
     * 
     * @param routeIds 路线ID数组
     * @return 是否成功
     */
    boolean deleteRouteByIds(Long[] routeIds);

    /**
     * 启用/禁用路线
     * 
     * @param routeId 路线ID
     * @param status 状态
     * @return 是否成功
     */
    boolean updateRouteStatus(Long routeId, String status);

    /**
     * 批量更新路线状态
     * 
     * @param routeIds 路线ID数组
     * @param status 状态
     * @return 是否成功
     */
    boolean batchUpdateStatus(Long[] routeIds, String status);

    /**
     * 路线优化
     * 
     * @param optimizeDTO 优化参数DTO
     * @return 优化结果VO
     */
    RouteOptimizationVO optimizeRoute(RouteOptimizeDTO optimizeDTO);

    /**
     * 智能路线推荐
     * 
     * @param merchantId 商家ID
     * @param deliveryType 配送类型
     * @param timeWindow 时间窗
     * @return 推荐路线列表
     */
    List<RouteVO> recommendRoutes(Long merchantId, String deliveryType, String timeWindow);

    /**
     * 复制路线
     * 
     * @param routeId 原路线ID
     * @param newRouteName 新路线名称
     * @return 新路线VO
     */
    RouteVO copyRoute(Long routeId, String newRouteName);

    /**
     * 获取活跃路线
     * 
     * @param merchantId 商家ID
     * @return 活跃路线列表
     */
    List<Route> getActiveRoutes(Long merchantId);

    /**
     * 获取商家路线
     * 
     * @param merchantId 商家ID
     * @return 商家路线列表
     */
    List<Route> getMerchantRoutes(Long merchantId);

    /**
     * 路线点位管理
     */
    
    /**
     * 添加路线点位
     * 
     * @param routeId 路线ID
     * @param pointName 点位名称
     * @param pointType 点位类型
     * @param longitude 经度
     * @param latitude 纬度
     * @param sequence 序号
     * @param estimatedTime 预计时间
     * @return 点位ID
     */
    Long addRoutePoint(Long routeId, String pointName, String pointType, 
                      Double longitude, Double latitude, Integer sequence, Integer estimatedTime);

    /**
     * 更新路线点位
     * 
     * @param pointId 点位ID
     * @param pointName 点位名称
     * @param longitude 经度
     * @param latitude 纬度
     * @param sequence 序号
     * @param estimatedTime 预计时间
     * @return 是否成功
     */
    boolean updateRoutePoint(Long pointId, String pointName, Double longitude, 
                           Double latitude, Integer sequence, Integer estimatedTime);

    /**
     * 删除路线点位
     * 
     * @param pointIds 点位ID数组
     * @return 是否成功
     */
    boolean deleteRoutePoints(Long[] pointIds);

    /**
     * 获取路线点位
     * 
     * @param routeId 路线ID
     * @return 点位列表
     */
    List<RoutePoint> getRoutePoints(Long routeId);

    /**
     * 路线时间窗管理
     */
    
    /**
     * 设置路线时间窗
     * 
     * @param routeId 路线ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param dayOfWeek 星期几
     * @param isActive 是否激活
     * @return 时间窗ID
     */
    Long setRouteTimeWindow(Long routeId, String startTime, String endTime, 
                           String dayOfWeek, Boolean isActive);

    /**
     * 更新路线时间窗
     * 
     * @param timeWindowId 时间窗ID
     * @param startTime 开始时间
     * @param endTime 结束时间
     * @param isActive 是否激活
     * @return 是否成功
     */
    boolean updateRouteTimeWindow(Long timeWindowId, String startTime, String endTime, Boolean isActive);

    /**
     * 删除路线时间窗
     * 
     * @param timeWindowIds 时间窗ID数组
     * @return 是否成功
     */
    boolean deleteRouteTimeWindows(Long[] timeWindowIds);

    /**
     * 获取路线时间窗
     * 
     * @param routeId 路线ID
     * @return 时间窗列表
     */
    List<RouteTimeWindow> getRouteTimeWindows(Long routeId);

    /**
     * 设置路线容量
     * 
     * @param routeId 路线ID
     * @param maxCapacity 最大容量
     * @param currentCapacity 当前容量
     * @param capacityUnit 容量单位
     * @return 是否成功
     */
    boolean setRouteCapacity(Long routeId, Integer maxCapacity, Integer currentCapacity, String capacityUnit);

    /**
     * 路线统计分析
     */
    
    /**
     * 获取路线统计信息
     * 
     * @param routeId 路线ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 统计信息VO
     */
    RouteStatisticsVO getRouteStatistics(Long routeId, String startDate, String endDate);

    /**
     * 获取路线分析报告
     * 
     * @param routeId 路线ID
     * @param analysisType 分析类型
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 分析报告VO
     */
    RouteAnalysisVO getRouteAnalysis(Long routeId, String analysisType, String startDate, String endDate);

    /**
     * 获取路线效率分析
     * 
     * @param routeId 路线ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 效率分析数据
     */
    Map<String, Object> getRouteEfficiency(Long routeId, String startDate, String endDate);

    /**
     * 获取路线成本分析
     * 
     * @param routeId 路线ID
     * @param startDate 开始日期
     * @param endDate 结束日期
     * @return 成本分析数据
     */
    Map<String, Object> getRouteCostAnalysis(Long routeId, String startDate, String endDate);

    /**
     * 路线模板管理
     */
    
    /**
     * 创建路线模板
     * 
     * @param templateDTO 模板DTO
     * @return 模板ID
     */
    Long createRouteTemplate(RouteTemplateDTO templateDTO);

    /**
     * 应用路线模板
     * 
     * @param templateId 模板ID
     * @param routeName 路线名称
     * @param merchantId 商家ID
     * @return 路线VO
     */
    RouteVO applyRouteTemplate(Long templateId, String routeName, Long merchantId);

    /**
     * 路线实时监控
     */
    
    /**
     * 获取路线实时状态
     * 
     * @param routeId 路线ID
     * @return 实时状态数据
     */
    Map<String, Object> getRouteRealTimeStatus(Long routeId);

    /**
     * 获取路线预警信息
     * 
     * @param routeId 路线ID
     * @return 预警信息列表
     */
    List<Map<String, Object>> getRouteAlerts(Long routeId);

    /**
     * 设置路线预警规则
     * 
     * @param routeId 路线ID
     * @param alertType 预警类型
     * @param alertRule 预警规则
     * @param notifyUsers 通知用户
     * @return 是否成功
     */
    boolean setRouteAlert(Long routeId, String alertType, String alertRule, String notifyUsers);

    /**
     * 路线健康检查
     * 
     * @param routeId 路线ID
     * @return 健康状态
     */
    Map<String, Object> routeHealthCheck(Long routeId);

    /**
     * 路线数据同步
     * 
     * @param routeId 路线ID
     * @param syncType 同步类型
     * @return 是否成功
     */
    boolean syncRouteData(Long routeId, String syncType);

    /**
     * 刷新路线缓存
     * 
     * @param routeId 路线ID
     * @return 是否成功
     */
    boolean refreshRouteCache(Long routeId);

    /**
     * 导入路线数据
     * 
     * @param routeList 路线列表
     * @return 导入结果消息
     */
    String importRoutes(List<Route> routeList);

    /**
     * 路线性能优化
     * 
     * @param routeId 路线ID
     * @param optimizationType 优化类型
     * @return 优化结果
     */
    Map<String, Object> optimizeRoutePerformance(Long routeId, String optimizationType);
}